package com.gitee.xmhzzz.component.common.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.Collections;
import java.util.List;

/**
  * @ClassName
  * @Description
  * @Author wzq
  * @Date 2023/12/15 17:04
  * @Version 1.0
  */
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class PageVO<T> {

    /**
     * 数据列表
     */
    private List<T> records = Collections.emptyList();

    /**
     * 总条数
     */
    private long total;

    /**
     * 每页显示条数
     */
    private long size;

    /**
     * 当前页
     */
    private long current;

    /**
     * 总页数
     */
    private long pages;

    /**
     * 空的分页对象
     */
    public static final PageVO<?> EMPTY = new PageVO<>(Collections.emptyList());

    /**
     * 获取空的分页对象
     *
     * @return 统一分页对象
     */
    public static <T> PageVO<T> empty() {
        return (PageVO<T>) EMPTY;
    }

    /**
     * 分页对象转换
     *
     * @param records 数据列表
     * @param current 当前页
     * @param size    每页显示条数
     * @param total   总条数
     * @return 统一分页对象
     */
    public static <T> PageVO<T> of(List<T> records, long current, long size, long total) {
        return new PageVO<>(records, current, size, total);
    }

    /**
     * 构造器 - 数组转分页
     *
     * 默认current  1
     * 默认size  数组长度（如果数组长度为0，size为10）
     * 默认total 数组长度
     *
     * @param records 列表数据
     */
    public PageVO(List<T> records) {
        this(records, 1L, records.size(), records.size());
    }

    /**
     * 构造器
     *
     * @param records 数据列表
     * @param current 当前页（从1开始）
     * @param size    每页显示条数
     * @param total   总条数
     */
    public PageVO(List<T> records, long current, long size, long total) {
        this(records, total, Math.max(size, 10L), Math.max(current, 1L), 0L);
        this.pages = this.calculatePages(size, total);
    }

    /**
     * 计算总页数
     *
     * @param size  每页显示条数
     * @param total 总条数
     * @return 总页数
     */
    private long calculatePages(long size, long total) {
        if (size == 0L) {
            return 0L;
        }

        long pages = total / size;
        if (total % size != 0L) {
            ++pages;
        }
        return pages;
    }
}
